<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="TohOv" id="TohOv"><span data-lake-id="u325a5507" id="u325a5507">典型回答</span></h1>
  <p data-lake-id="ue504e9f8" id="ue504e9f8"><br></p>
  <p data-lake-id="ufafd1316" id="ufafd1316"><span data-lake-id="u9a6eb4e1" id="u9a6eb4e1">RocketMQ中有这样几个角色：NameServer、Broker、Producer和Consumer</span></p>
  <p data-lake-id="u1b42e284" id="u1b42e284"><span data-lake-id="u2c790f29" id="u2c790f29">​</span><br></p>
  <p data-lake-id="u6f34b644" id="u6f34b644"><span data-lake-id="u0e828bd6" id="u0e828bd6">NameServer：NameServer是RocketMQ的路由和寻址中心，它维护了Broker和Topic的路由信息，提供了Producer和Consumer与正确的Broker建立连接的能力。NameServer还负责监控Broker的状态，并提供自动发现和故障恢复的功能。</span></p>
  <p data-lake-id="u1f642d4b" id="u1f642d4b"><span data-lake-id="u3b98d900" id="u3b98d900">​</span><br></p>
  <p data-lake-id="u24d9cc2e" id="u24d9cc2e"><span data-lake-id="ud3058e27" id="ud3058e27">Broker：Broker是RocketMQ的核心组件，负责存储、传输和路由消息。它接收Producer发送的消息，并将其存储在内部存储中。并且还负责处理Consumer的订阅请求，将消息推送给订阅了相应Topic的Consumer。</span></p>
  <p data-lake-id="u13c6118b" id="u13c6118b"><span data-lake-id="u9cc731e0" id="u9cc731e0">​</span><br></p>
  <p data-lake-id="u3d8e5c57" id="u3d8e5c57"><span data-lake-id="ud00f2365" id="ud00f2365">Producer（消息生产者）：Producer是消息的生产者，用于将消息发送到RocketMQ系统。</span></p>
  <p data-lake-id="u4511c0eb" id="u4511c0eb"><span data-lake-id="uf408c5f6" id="uf408c5f6">​</span><br></p>
  <p data-lake-id="u4af08c33" id="u4af08c33"><span data-lake-id="u1a2995ba" id="u1a2995ba">Consumer（消息消费者）：Consumer是消息的消费者，用于从RocketMQ系统中订阅和消费消息。</span></p>
  <p data-lake-id="u880e19ab" id="u880e19ab"><span data-lake-id="u47c52a3e" id="u47c52a3e">​</span><br></p>
  <p data-lake-id="u051e855e" id="u051e855e"><span data-lake-id="u36771063" id="u36771063">RocketMQ的工作过程大致如下：</span></p>
  <p data-lake-id="u7819722a" id="u7819722a"><span data-lake-id="u8a01ee46" id="u8a01ee46">​</span><br></p>
  <p data-lake-id="uac1ef24d" id="uac1ef24d"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1687077878860-1ef12f72-2370-4398-831c-9243f1a92189.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_36%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u8f06b0ed" id="u8f06b0ed"><span data-lake-id="uce8ef856" id="uce8ef856">​</span><br></p>
  <p data-lake-id="u6d12d9a8" id="u6d12d9a8"><span data-lake-id="ue4835f90" id="ue4835f90">1、启动NameServer，他会等待Broker、Producer以及Consumer的链接。</span></p>
  <p data-lake-id="u920b5af3" id="u920b5af3"><span data-lake-id="ucf35cb07" id="ucf35cb07">​</span><br></p>
  <p data-lake-id="uc8fd0b44" id="uc8fd0b44"><span data-lake-id="ucb789e56" id="ucb789e56">2、启动Broker，会和NameServer建立连接，定时发送心跳包。心跳包中包含当前Broker信息(ip、port等)、Topic信息以及Borker与Topic的映射关系。</span></p>
  <p data-lake-id="uafbba8cc" id="uafbba8cc"><span data-lake-id="ufbe3fca2" id="ufbe3fca2">​</span><br></p>
  <p data-lake-id="ud4bf2f9d" id="ud4bf2f9d"><span data-lake-id="ue8859a1e" id="ue8859a1e">3、启动Producer，启动时先随机和NameServer集群中的一台建立长连接，并从NameServer中获取当前发送的Topic所在的所有Broker的地址；然后从队列列表中轮询选择一个队列，与队列所在的Broker建立长连接，进行消息的发送。</span></p>
  <p data-lake-id="u15b04c19" id="u15b04c19"><span data-lake-id="udd0900e0" id="udd0900e0">​</span><br></p>
  <p data-lake-id="u73a2a96f" id="u73a2a96f"><span data-lake-id="ubc0737b8" id="ubc0737b8">4、Broker接收Producer发送的消息，当配置为同步复制时，master需要先将消息复制到slave节点，然后再返回“写成功状态”响应给生产者；当配置为同步刷盘时，则还需要将消息写入磁盘中，再返回“写成功状态”；要是配置的是异步刷盘和异步复制，则消息只要发送到master节点，就直接返回“写成功”状态。</span></p>
  <p data-lake-id="u06a6cadc" id="u06a6cadc"><span data-lake-id="ud82d34e1" id="ud82d34e1">​</span><br></p>
  <p data-lake-id="u87f8d97e" id="u87f8d97e"><span data-lake-id="u5d87c5d1" id="u5d87c5d1">5、启动Consumer，过程和Producer类似，先随机和一台NameServer建立连接，获取订阅信息，然后在和需要订阅的Broker建立连接，获取消息。</span></p>
  <p data-lake-id="u267bf2fc" id="u267bf2fc"><span data-lake-id="u3694b0be" id="u3694b0be">​</span><br></p>
  <p data-lake-id="ub1fc3b76" id="ub1fc3b76"><span data-lake-id="u9f6b946e" id="u9f6b946e">​</span><br></p>
  <p data-lake-id="u05f32691" id="u05f32691"><br></p>
 </body>
</html>